/* Gauge - Performance Measurement Framework for Mobile Platforms
 * Copyright (C) 2013, Juha Hytonen <juha.a.hytonen@gmail.com>
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package org.gauge;

import org.joda.time.DateTime;

/**
 * Serializes log entries into strings and vice versa.
 * 
 * @see LogEntry
 */
public final class LogEntrySerializer extends AbstractSerializer {
	
	private static final int TimestampPos = 0;
	private static final int TypePos = 1;
	private static final int MessagePos = 2;
	
	private LogEntry logEntry;
	private String logEntryString;
	private final String separator;
	
	public LogEntrySerializer(LogEntry logEntry) {
		this(logEntry, DefaultSeparator);
	}
	
	public LogEntrySerializer(LogEntry logEntry, String separator) {
		this.logEntry = logEntry;
		this.separator = separator;
		serialize();
	}
	
	private void serialize() {
		String timestamp = convertToTimestamp(logEntry.GetDateTime());
		String type = logEntry.GetType().toString();
		String message = logEntry.GetMessage();
		
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append(timestamp);
		stringBuilder.append(separator);
		stringBuilder.append(type);
		stringBuilder.append(separator);
		stringBuilder.append(message);
		
		logEntryString = stringBuilder.toString();
	}
	
	public LogEntrySerializer(String logEntryString) {
		this(logEntryString, DefaultSeparator);
	}
	
	public LogEntrySerializer(String logEntryString, String separator) {
		this.logEntryString = logEntryString;
		this.separator = separator;
		deserialize();
	}
	
	private void deserialize() {
		String[] logEntryParts = logEntryString.split(separator);
		DateTime date = convertToDateTime(logEntryParts[TimestampPos]);
		LogEntry.Type type = LogEntry.Type.valueOf(logEntryParts[TypePos]);
		String message = logEntryParts[MessagePos];
		
		logEntry = new LogEntry(date, type, message);
	}
	
	public LogEntry GetAsLogEntry() {
		return logEntry;
	}
	
	public String GetAsString() {
		return logEntryString;
	}

}
